package main;

import scala.xml.{Node}
import utils._
import objects._
import java.util.logging.Logger

class Validator(schem:SchemaXML,fichierResult : String) {

  var listError :List[Error]=List(); 
  var commentaireFic : StringBuilder=new StringBuilder();
  val schema:SchemaXML = schem;
  
  
  protected final val logger = Logger.getLogger("Validator") 
  
  /**
    * test if the schema contains the element
    **/
    def verification(elmt:Element):boolean = {
  
      //Recuperation du noeud
      println("La balise : " + elmt.nameBalise + "\n Les parents" + elmt.parents.toString + "\n Les fils : " + elmt.sons + "\n Les attibuts : " + elmt.atts )
      val theNode:Seq[Node] = schema.findNode(elmt.parents, schema.document.children)
      println(" theNode : " + theNode)
  
      //Traitement du noeud
      theNode.length match {
        case 0 => listError=new Error("MissingElt", elmt.nameBalise) :: listError; //PROBLEME AJOUT DANS LA LISTE DES ERREURS 
        case _ => elmt.sons.length match {
          case 0 => (theNode.apply(0) \ "element").length match {
            case 0 => //Pas de probleme
            case _ => listError=new Error("NoNode","") :: listError;logger.warning("ERREUR on a pas de fils dans le document alors kil devrait en avoir " + (theNode.apply(0) \ "_").length)
          }
          case _ => (schema.checkChildren(elmt.sons, (theNode.apply(0) \ "_"),"")) match {
            case false => logger.warning("ERREUR pendant la verification des fils")
            case true => schema.checkAttributes(elmt.atts, theNode) match {
              case false => listError=new Error("MissingAttr","") :: listError;logger.warning("ERREUR avec les attributs")
              case true => /*elmt.typeElmt.contains((theNode.apply(0) \ "@type").text) match {
                case false => (theNode.apply(0) \ "@type").text match {
                  case "" => return true
                  case Seq('x','s',':',_*) => return false
                  case _ => return true
                }
                case true => return true
              }*/
            }
          }
        }
      }
      
      println()
      
      var tailleErr : int=listError.size;
      listError=schema.listError;
      if(listError.size>tailleErr){        
        val errTmp : Error=listError.head;
        listError=listError.tail;
        errTmp.ligne=elmt.ligne;
        errTmp.column=elmt.column;  
        listError=errTmp :: listError;
      }
      
      commentaireFic=schema.com;
      //Verification du type de l'element
      true
}
}
